/****************************************************************
 * AmplitudeLimiterFilter()限幅滤波算法
 * 调用函数 GetValue(),获取当前采样值
 * Value,最近一次有效采样值，改变量为全局变量
 * NewValue，当前采样值
 * RetuenValue,返回值
 * ***********************************************************/

unsigned char Value;
unsigned char LimitFilter(unsigned char DiffValue)
{
    unsigned char NewValue;
    unsigned char ReturnValue;
    NewValue = GetValue();
    if(((NewValue - Value)>DiffValue) || ((Value - NewValue)>DiffValue))
    ReturnValue = Value;
    else ReturnValue = NewValue;
    return ReturnValue;
}

/**************************************************************
 * ArithmeticalAverageValueFilter()算术平均滤波法
 * 方法：连续读取N个采样值进行算术平均运算
 * 调用函数 GetValue(),获取当前采样值
 * Value,平均值
 * Sum，连续采样之和
 * ***********************************************************/
unsigned char MeanFilter(unsigned char N)
{
   unsigned char  i;
   unsigned char  Value;
   unsigned int Sum = 0;
   for(i=0;i<N;i++)
   {
       Sum += GetValue();
   }
   Value = Sum/N;
   return Value;
}

/**************************************************************
 * GlideAverageValueFilter(),滑动平均滤波法
 * 方法：连续读取N个采样值，每次采样到一个新值放入队尾，并扔掉队首的一次数据。
 * 调用函数 GetValue(),获取当前采样值
 * Value,平均值
 * Sum，连续采样之和
 * Data[],暂存数据的数组，属于全局变量
 * ***********************************************************/
#define  N    12
unsigned char Data[N];

unsigned char GlideMeanFilter()
{
   unsigned char  i;
   unsigned char  Value;
   unsigned short Sum = 0;

   Data[N] =  GetValue();   //采集的数据放到数组的最高位
   for(i=0;i<N;i++)
   {
       Data[i] = Data[i+1];  //所有数据左移，扔掉低位
       Sum += Data[i];       //求和
   }
   Value = Sum/N;
   return Value;
}

/**************************************************************
 * GlideMiddleAverageValueFilter(),滑动中位值平均滤波法
 * 方法：连续读取N个采样值，每次采样到一个新值放入队尾，并扔掉队首的一次数据。
 *       队列中N个数据去掉最大值和最小值，然后计算N-2个数据的平均值。
 * 调用函数 GetValue(),获取当前采样值
 * Value,平均值
 * Sum，连续采样之和
 * Data[],暂存数据的数组，属于全局变量
 * ***********************************************************/
#define  N    12
unsigned char Data[N];

unsigned char GlideMiddleAverageValueFilter()
{
   unsigned char  i;
   unsigned char  Value,MinValue,MaxValue;
   unsigned short Sum = 0;

   Data[N] =  GetValue();   //采集的数据放到数组的最高位
   MinValue = Data[N];
   MaxValue = Data[N];
   Sum = Data[N];
   for(i=0;i<N;i++)
   {
       if(Data[i]>MaxValue) MaxValue = Data[i];      //比较更新最大值
       else if(Data[i]<MinValue) MinValue = Data[i]; //比较更新最小值
       Sum += Data[i];       //求和
       Data[i] = Data[i+1];  //所有数据左移，扔掉低位
   }
   Sum = Sum - MaxValue -MinValue;
   Value = Sum/N-2;
   return Value;
}


